package com.roy.nio;

import java.nio.ByteBuffer;
import java.nio.IntBuffer;

/**
 * @author ：楼兰
 * @date ：Created in 2021/6/2
 * @description:
 **/

public class BufferDemo {
    public static void main(String[] args) {
        //可以跟踪下IntBuffer的limit、position、mark三个属性来理解下这些操作
        //定义Buffer的数组大小
        final IntBuffer intBuffer = IntBuffer.allocate(5);
        //往Buffer数组中添加数据，不能超过他的容量。超过容量会报错。
        for(int i = 0 ; i < intBuffer.capacity();i ++){
            intBuffer.put( i*5 );
        }
        //由写转为读必须要进行一下切换。本质是limit变更为position，限定后面的读操作不能超过之前写入的数据范围
        // 另外将position调整到0，表示后续从数组的开始位置读
        intBuffer.flip();
        //查看第二个位置的数据
        System.out.println("读取指定位置的数据："+intBuffer.position(2));
        while (intBuffer.hasRemaining()){
            //顺序读
            System.out.println("依次读取数组中的数据："+ intBuffer.get());
        }

        //创建一个字节流
        ByteBuffer buffer = ByteBuffer.allocate(64);
        //按类型写入数据，本质就是按固定的大小写入字节流。
        buffer.putInt(100);
        buffer.putLong(9);
        buffer.putChar('王');
        buffer.putShort((short) 4);
        //读写切换
        buffer.flip();
        //按照固定的大小顺序读字节，才能获取正确的值。顺序换了依然能读到字节流，但是无法还原成原始数据。
        System.out.println(buffer.getInt());
        System.out.println(buffer.getLong());
        System.out.println(buffer.getChar());
        System.out.println(buffer.getShort());
    }
}
